// Copyright (C) 2016 Jordan Harband. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
description: allowProxyTraps helper should default throw on all the proxy trap named methods being invoked
esid: pending
author: Jordan Harband
includes: [proxyTrapsHelper.js]
---*/
function Test() {
    var overrides = {
        getPrototypeOf: function () {},
        setPrototypeOf: function () {},
        isExtensible: function () {},
        preventExtensions: function () {},
        getOwnPropertyDescriptor: function () {},
        has: function () {},
        get: function () {},
        set: function () {},
        deleteProperty: function () {},
        defineProperty: function () {},
        enumerate: function () {},
        ownKeys: function () {},
        apply: function () {},
        construct: function () {},
    };
    var traps = allowProxyTraps(overrides);

    function assertTrapSucceeds(trap) {
        if (typeof traps[trap] !== 'function') {
            throw new Test262Error('trap ' + trap + ' is not a function');
        }
        if (traps[trap] !== overrides[trap]) {
            throw new Test262Error('trap ' + trap + ' was not overriden in allowProxyTraps');
        }
        var threw = false;
        try {
            traps[trap]();
        } catch (e) {
            threw = true;
        }
        if (threw) {
            throw new Test262Error('trap ' + trap + ' threw an error');
        }
    }

    function assertTrapThrows(trap) {
        if (typeof traps[trap] !== 'function') {
            throw new Test262Error('trap ' + trap + ' is not a function');
        }
        var failedToThrow = false;
        try {
            traps[trap]();
            failedToThrow = true;
        } catch (e) {}
        if (failedToThrow) {
            throw new Test262Error('trap ' + trap + ' did not throw an error');
        }
    }

    assertTrapSucceeds('getPrototypeOf');
    assertTrapSucceeds('setPrototypeOf');
    assertTrapSucceeds('isExtensible');
    assertTrapSucceeds('preventExtensions');
    assertTrapSucceeds('getOwnPropertyDescriptor');
    assertTrapSucceeds('has');
    assertTrapSucceeds('get');
    assertTrapSucceeds('set');
    assertTrapSucceeds('deleteProperty');
    assertTrapSucceeds('defineProperty');
    assertTrapSucceeds('ownKeys');
    assertTrapSucceeds('apply');
    assertTrapSucceeds('construct');

// enumerate should always throw because the trap has been removed
    assertTrapThrows('enumerate');
}

// preheat
const NUMBER_OF_PREHEAT = 1;
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}

ArkTools.jitCompileAsync(Test);
assert.sameValue(ArkTools.waitJitCompileFinish(Test), true, '[JIT] JIT disabled.');

// test
const NUMBER_OF_TEST = 1; // or 2
for (let i = 0; i < NUMBER_OF_TEST; i++) {
    Test();
}
